package ar.pmt.persistencia.impl;

import java.util.ArrayList;
import java.util.Collection;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import ar.pmt.modelo.beans.PersistenceObject;

/**
 * @author mparissi
 * Clase que contiene los metodos primitivos de los DAO
 * @param <Obj> 
 */
public abstract class ManagerDAOImpl<Obj extends PersistenceObject> extends HibernateDaoSupport{

	
	/**
	 *  type del objecto
	 */
	protected Class<Obj> typeDelObj;

	/**
	 * @param typeDelObj Class
	 */
	public ManagerDAOImpl(Class<Obj> typeDelObj) {
		this.typeDelObj = typeDelObj;
	}

	/**
	 * @param po Objeto a insertar
	 * @throws Exception manejda por aspecto
	 */
	public synchronized void crear(Obj po) throws Exception{
		getHibernateTemplate().save(po);
	}
	
	/**
	 * @param po Objeto a actualizar
	 * @throws Exception manejada por aspecto
	 */
	public synchronized void actualizar(Obj po) throws Exception{
		
		getHibernateTemplate().update(po);
	}
	
	/**
	 * @param po Objeto a elimiar
	 * @throws Exception manejada por aspecto
	 */
	public synchronized void eliminar(Obj po) throws Exception{
		getHibernateTemplate().delete(po);
	}
	
	/*public synchronized Obj obtenerPorId(Integer id) throws Exception{
		return (Obj) hibernateTemplate.load(this.typeDelObj, id);
	}*/
	
	/**
	 * @param id Id de objeto a obtener
	 * @return Objeto con determinado id
	 * @throws Exception manejada por aspecto
	 */
	@SuppressWarnings("unchecked")
	public synchronized Obj obtenerPorId(Integer id)throws Exception {
		ArrayList<Obj> lista = (ArrayList<Obj>) getHibernateTemplate().
							find("from "+ this.typeDelObj.getSimpleName()+ " where id = ?", id);
		if(lista == null || lista.size() == 0){
			return null;
		}
		return lista.get(0);
	}
	
	/**
	 * @return Obtiene todos los objetos
	 * @throws Exception manejada por aspecto
	 */
	@SuppressWarnings("unchecked")
	public synchronized Collection<Obj> obtenerTodos() throws Exception{
		return (Collection<Obj>) getHibernateTemplate().find("from " + this.typeDelObj.getSimpleName());
	}
	
}
